---
sidebar_position: 2
---

# Cors跨域

跨源资源共享（CORS）是一种安全特性，允许你指定哪些外部资源可以在浏览器中访问你的应用程序。在.NET 6中，配置CORS需要几个步骤，本教程将指导你如何设置和使用CORS。

## 1. 启用CORS

首先，你需要在你的应用程序中启用CORS。这通常在`Program.cs`文件中完成。

```csharp

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowSpecificOrigin",
        builder => builder.WithOrigins("https://example.com")
            .AllowAnyMethod()
            .AllowAnyHeader());
});

```

在上面的代码中，我们添加了一个名为`AllowSpecificOrigin`的CORS策略，它允许来自`https://example.com`的跨域请求，并允许任何HTTP方法和头。

## 2. 应用CORS策略

在`Program.cs`文件中，你需要使用CORS中间件来应用你的策略。

```csharp

var app = builder.Build();

// 一般是在Build之后
app.UseCors("AllowSpecificOrigin");

```

在上面的代码中，我们通过调用`UseCors`方法并传入我们之前定义的策略名称来应用CORS策略。

## 3. 允许所有来源

如果你想允许所有来源的跨域请求，你可以使用`AllowAnyOrigin`方法。

```csharp
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAll",
        builder => builder
            .SetIsOriginAllowed(_ => true)
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
});
```

请注意，`AllowAnyOrigin`与凭证（如cookies）一起使用时是不安全的，因此默认情况下不允许发送凭证。如果你需要发送凭证，你应该明确列出允许的来源。

## 4. 允许特定的HTTP方法

你可以指定允许的HTTP方法，而不是使用`AllowAnyMethod`。

```csharp
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowSpecificMethods",
        builder => builder.WithOrigins("https://example.com")
                          .WithMethods("GET", "POST", "PUT")
                          .AllowAnyHeader());
});
```

## 5. 允许特定的头

与HTTP方法类似，你也可以指定允许的头，而不是使用`AllowAnyHeader`。

```csharp
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowSpecificHeaders",
        builder => builder.WithOrigins("https://example.com")
                          .AllowAnyMethod()
                          .WithHeaders("Content-Type", "Authorization"));
});
```

## 6. 允许凭证

如果你的API需要处理凭证（如cookies或认证头），你可以使用`AllowCredentials`方法。

```csharp
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowCredentials",
        builder => builder.WithOrigins("https://example.com")
                          .AllowAnyMethod()
                          .AllowAnyHeader()
                          .AllowCredentials());
});
```

请记住，当使用`AllowCredentials`时，你不能使用`AllowAnyOrigin`，你必须指定一个或多个确切的来源。

## 7. 设置预检请求的缓存时间

你可以设置浏览器缓存预检请求结果的时间，以减少预检请求的次数。

```csharp
builder.Services.AddCors(options =>
{
    options.AddPolicy("CorsPolicy",
        builder => builder.WithOrigins("https://example.com")
                          .AllowAnyMethod()
                          .AllowAnyHeader()
                          .SetPreflightMaxAge(TimeSpan.FromMinutes(10)));
});
```

在上面的代码中，预检请求的结果将被缓存10分钟。

## 8. 在控制器级别应用CORS策略

你也可以在控制器或动作级别应用CORS策略，而不是全局应用。

```csharp
[ApiController]
[Route("[controller]")]
[Cors("AllowSpecificOrigin")]
public class MyController : ControllerBase
{
    // 控制器动作...
}
```

在上面的代码中，`AllowSpecificOrigin`策略将应用于`MyController`中的所有动作。

## 结论

在.NET 6中配置CORS是通过定义策略、在服务中注册这些策略，然后在应用程序的中间件管道中应用它们来完成的。你可以根据需要创建多个策略，并在全局或控制器级别应用它们。始终确保你的CORS策略符合你的安全需求，避免过于宽松的配置，特别是在处理敏感数据时。